今天就繼續 MVP 實戰吧~ CI/CD,我來了~
不清楚目前進度的可以先回到昨天的專案架構,也會包含今天要詳細說明的三個檔案
fabric 模組部署正式站fabric 是 Python 的一個模組,可以方便我們連線到遠端的 server,並將測試完的程式更新同步到 server,其實就是在 server 當中進到資料夾執行 git pull,以概念上可以直接用 shell script 撰寫,但是fabric可以讓我們方便的將內容變成函數,直接執行 fab {函數名稱} 就可以達成了
另外,有一些系統更新後可能會需要重啟,但是 airflow 只需要將程式碼 pull 下來後就可以直接同步更新了
$ pip install fabric
專案架構有建立起來之後,就只需要將模組名稱或特定版本放到 requirements.txt 當中,不論是用 Dockerfile 建立正式環境或是 venv 建立測試環境,只需要重新執行就能同步所有模組安裝。
import os
from fabric import Connection, task
@task
def staging(ctx):
    with Connection(
        "YOUR SERVER IP",
        user="YOUR USER NAEM",
        connect_kwargs={"key_filename":os.environ['KEY_PATH']}
    ) as conn:
        with conn.cd("/airflow"):
            conn.run("git pull origin main --rebase")
其實上方就超級白話文,建立連接之後,就可以 cd 到專案目錄,然後直接執行 git pull origin main --rebase,當然也可以針對每一次的 commit 做更細部的部署,例如發現 commit 有修改 docker-compose.yml,就需要在 pull 完之後重新建立環境等等
Makefile 方便管理指令集最早接觸Makefile應該都是寫 C 語言的時候,覺得對大部分專案都很適合管理指令集,統整在一個檔案,後續不管是測試或部署都會更方便
基本上就是將需要執行的 terminal 指令放在縮排內,基本範例像這樣:
create_test_folder:
	mkdir test_folder
當執行 create_test_folder 時,就執行下方指令,就會順利 create 出新的資料夾
執行 Makefile 的方式就是 make create_test_folder
VENV=venv/bin
.PHONY: venv
venv: venv/bin/activate
venv/bin/activate: requirements.txt
	@test -d venv || python3 -m venv venv
	@$(VENV)/python -m pip install --upgrade pip
	@$(VENV)/pip install -Ur requirements.txt
.PHONY: lint
lint: venv
	@$(VENV)/python -m ruff check dags/*.py
	@$(VENV)/python -m ruff check plugins
	@$(VENV)/python -m ruff check tests
	@$(VENV)/sqlfluff fix dbt/*/models/*/*.sql
.PHONY: test
test: venv
	@$(VENV)/python -m pytest tests/dags/test_*.py
這裡面就分成建立虛擬環境、和檢查 lint、執行測試等等
可以看到在 lint 和 test 後面都有加上 venv,像這樣 lint: venv 和 test: venv,意思就是要先確定執行過 venv 才能繼續
buildspec.yml 測試與部署自動化前面提到的 AWS CodeBuild 就是會使用到這個buildspec.yml檔案,會有兩種檔案buildspec_test.yml 和 buildspec_deploy.yml,是因為有兩種 stage,分別是測試和部署,分開來可以確保各自獨立,才不會發生測試沒過卻直接部署的慘案,當然可以透過 on-failure: ABORT 或是有嘟個環境,就算部署也只是測試站等等避免,但是各自獨立還是比較保險。
buildspec_test.yml用在測試專案,會測試 lint 和 test,具體執行方法和指令可以看上方的 Makefile,基本上就是建立虛擬環境➡️執行 code lint 測試➡️執行 code quality 測試,其中的 on-failure: ABORT 就是代表一但失敗了,整個 codebuild 就會暫停。
version: 0.2
phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      - make venv
  pre_build:
    on-failure: ABORT
    commands:
      - make lint
  build:
    on-failure: ABORT
    commands:
      - make test
buildspec_deploy.yml用於部署專案,最上方的 env: 是為了將 SSH KEY 從 AWS 的 secrets-manager 載入到環境當中,並對應到 pre_build 區塊,載入SSH KEY之後會再 decode 存到環境變數,後續 fab staging 才能使用並連接到遠端的 server 更新程式部署。
version: 0.2
env:
  secrets-manager:
    SSH_KEY: {YOUR SECRET ARN}
phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      - pip install fabric
  pre_build:
    on-failure: ABORT
    commands:
      - echo "$SSH_KEY" | base64 -d > "$KEY_PATH"
  build:
    on-failure: ABORT
    commands:
      - fab staging